package commomgame;

import games.patience.core.RegionOfDiscard;
import games.patience.core.RegionOfFoundations;
import commongame.core.RegionOfReserves;

/**
 *
 * Classe que invoca métodos que validam as movimentações das cartas a depender da carta, da região de
 * origem da mesma e da região de destino escolhidas pelo usuário do jogo
 * @author Fernanda & Igo
 */
public class Director {

    /**
     * Método invocado quando usuário movimenta carta da região de reservas para a região de fundações
     *
     * @param value Representa o valor da carta escolhida pelo usuário para movimentação
     * @param nipe Representa o nipe da carta escolhida pelo usuário para movimentação
     * @param origin Representa o nome da subregião da região de origem da carta:região de reservas
     * @param target Representa o nome da subregião da região de destino da carta:região de fundações
     * @param regionOrigin Representa a região de origem da carta:região de reservas
     * @param regionTarget Representa a região de destino da carta: região de fundações
     * @return permissão de movimentação da carta
     */
    public static boolean invokeRuleReservesFoundations(int value, String nipe, String origin, String target, RegionOfReserves regionOrigin, RegionOfFoundations regionTarget) {

        return regionTarget.verifyRule(value, nipe, searchSubRegionOfReserves(origin, regionOrigin), searchSubRegionOfFoundations(target, regionTarget));

    }

    /**
     * Método invocado quando usuário movimenta carta da região de discarte para a região de fundações
     *
     * @param value Representa o valor da carta escolhida pelo usuário para movimentação
     * @param nipe Representa o nipe da carta escolhida pelo usuário para movimentação
     * @param origin Representa o nome da subregião da região de origem da carta:região de discarte
     * @param target Representa o nome da subregião da região de destino da carta:região de fundações
     * @param regionOrigin Representa a região de origem da carta:região de discarte
     * @param regionTarget Representa a região de destino da carta: região de fundações
     * @return permissão de movimentação da carta
     */
    public static boolean invokeRuleDiscardFoundations(int value, String nipe, String origin, String target, RegionOfDiscard regionOrigin, RegionOfFoundations regionTarget) {

        return regionTarget.verifyRule(value, nipe, searchSubRegionOfDiscard(origin, regionOrigin), searchSubRegionOfFoundations(target, regionTarget));

    }

    /**
     * Método invocado quando usuário movimenta carta da região de reservas para a região de reservas
     *
     * @param value Representa o valor da carta escolhida pelo usuário para movimentação
     * @param nipe Representa o nipe da carta escolhida pelo usuário para movimentação
     * @param origin Representa o nome da subregião da região de origem da carta:região de reservas
     * @param target Representa o nome da subregião da região de destino da carta:região de reservas
     * @param regionOrigin Representa a região de origem da carta:região de reservas
     * @param regionTarget Representa a região de destino da carta: região de reservas
     * @return permissão de movimentação da carta
     */
    public static boolean invokeRuleReservesReserves(int value, String nipe, String origin, String target, RegionOfReserves regionOrigin, RegionOfReserves regionTarget) {

        return regionTarget.verifyRule(value, nipe, searchSubRegionOfReserves(origin, regionOrigin), searchSubRegionOfReserves(target, regionTarget));

    }

    /**
     * Método invocado quando usuário movimenta carta da região de fundações para a região de reservas
     *
     * @param value Representa o valor da carta escolhida pelo usuário para movimentação
     * @param nipe Representa o nipe da carta escolhida pelo usuário para movimentação
     * @param origin Representa o nome da subregião da região de origem da carta:região de fundações
     * @param target Representa o nome da subregião da região de destino da carta:região de reservas
     * @param regionOrigin Representa a região de origem da carta:região de fundações
     * @param regionTarget Representa a região de destino da carta: região de reservas
     * @return permissão de movimentação da carta
     */
    public static boolean invokeRuleFoundationsReserves(int value, String nipe, String origin, String target, RegionOfFoundations regionOrigin, RegionOfReserves regionTarget) {

        return regionTarget.verifyRule(value, nipe, searchSubRegionOfFoundations(origin, regionOrigin), searchSubRegionOfReserves(target, regionTarget));

    }

    /**
     * Método invocado quando usuário movimenta carta da região de discarte para a região de reservas
     *
     * @param value Representa o valor da carta escolhida pelo usuário para movimentação
     * @param nipe Representa o nipe da carta escolhida pelo usuário para movimentação
     * @param origin Representa o nome da subregião da região de origem da carta:região de discarte
     * @param target Representa o nome da subregião da região de destino da carta:região de reservas
     * @param regionOrigin Representa a região de origem da carta:região de discarte
     * @param regionTarget Representa a região de destino da carta: região de reservas
     * @return permissão de movimentação da carta
     */
    public static boolean invokeRuleDiscardReserves(int value, String nipe, String origin, String target, RegionOfDiscard regionOrigin, RegionOfReserves regionTarget) {

        return regionTarget.verifyRule(value, nipe, searchSubRegionOfDiscard(origin, regionOrigin), searchSubRegionOfReserves(target, regionTarget));

    }

    /**
     * Método que busca a referência da subregião de origem ou destino da região de fundações a partir do nome da subregião escolhida pelo
     * usuário
     * @param name Representa o nome da subregião escolhida pelo usuário
     * @param region Representa a região de fundações
     * @return subregião de origem ou de destino escolhida pelo usuário
     */
    public static SubRegion searchSubRegionOfFoundations(String name, RegionOfFoundations region) {


        for (int i = 0; i < region.getNumberOfSubRegions(); i++) {


            if (region.getRegion().get(i).getName().equals(name)) {


                return region.getRegion().get(i);
            }
        }


        return null;
    }

    /**
     * Método que busca a referência da subregião de origem ou destino da região de reservas a partir do nome da subregião escolhida pelo
     * usuário
     * @param name Representa o nome da subregião escolhida pelo usuário
     * @param region Representa a região de reservas
     * @return subregião de origem ou de destino escolhida pelo usuário
     */
    public static SubRegion searchSubRegionOfReserves(String name, RegionOfReserves region) {
        for (int i = 0; i < region.getNumberOfSubRegions(); i++) {
            if (region.getRegion().get(i).getName().equals(name)) {
                return region.getRegion().get(i);
            }
        }

        return null;
    }

    /**
     * Método que busca a referência da subregião de origem ou destino da região de discarte a partir do nome da subregião escolhida pelo
     * usuário
     * @param name Representa o nome da subregião escolhida pelo usuário
     * @param region Representa a região de discarte
     * @return subregião de origem ou de destino escolhida pelo usuário
     */
    public static SubRegion searchSubRegionOfDiscard(String name, RegionOfDiscard region) {
        for (int i = 0; i < region.getNumberOfSubRegions(); i++) {
            if (region.getRegion().get(i).getName().equals(name)) {
                return region.getRegion().get(i);
            }
        }

        return null;
    }
}
